package main

import (
	"fmt"
	"time"
)

func main() {
	/*
		for 循环结构
		for init(变量初始值);condition(条件);post(满足条件执行的操作) {}
		变量初始值、条件、满足条件执行的操作 三个不一定每个都要有
		for {} 等效 while true {} 但在go中没有while
	*/
	//1、写法1标准写法
	for i := 0; i < 3; i++ {
		fmt.Println(i)
	}
	//2、写法2
	var j int
	for ; j < 3; j++ {
		fmt.Println(j)
	}

	//3、写法3
	for k := 0; k < 3; {
		fmt.Println(k)
		k++
	}

	//4、for中的死循环，相当于while true
	//var l int
	//for {
	//	l++
	//	time.Sleep(2 * time.Second) //休眠2秒
	//	fmt.Println(l)
	//}

	//5、for 求1到100的相加结果
	var sum int
	for i := 1; i <= 100; {
		sum += i // sum = sum + i
		i++
	}
	fmt.Println(sum)

	// 6、打印9x9发表
	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d * %d = %d ", j, i, i*j)
		}
		fmt.Println(" ")
	}

	//7、for循环还有种用法，for range ，主要对 字符串、数组、切片、map、channel
	/*
		for key value := range 数据结构变量 {
			// 在不同的类型中key和value代表的含义不同，下面我们来看下
			// 字符串  字符串的索引(key)	字符串对应的索引的字符值的拷贝(value)		如果不写key，那么返回的是索引
			// 数组    数组的索引			索引对应的值的拷贝							如果不写key，那么返回的是索引
			// 切片	  切片的索引			索引对应的值的拷贝							如果不写key，那么返回的是索引
			// map 	  map的key          value 返回的是key对应的值拷贝				如果不写key，那么返回的是map的值
			// channel 					value 返回的是channel接受的数据
		}
	*/
	str1 := "hello world"
	for index, value := range str1 {
		fmt.Println(index, value) // 打印的是字符串的索引和Unicode编号
		fmt.Printf("%c\n", value) // %c格式化输出Unicode编号代表的字符
		fmt.Printf("%c\n", str1[index])
		// 假如某个变量不想使用可以_匿名变量来存储，for k := range str1 {}  k获得是字符串的索引
	}

	// 8、 for的退出 continue(退出本次循环，继续后面循环) 、break(退出结束循环体，不要继续循环)
	raound := 0
	for {
		time.Sleep(1 * time.Second)
		raound++
		if raound == 5 {
			continue // 结束本次循环，继续后面的循环，5不会输出
		}
		if raound > 11 {
			break // 退出循环体，不再继续循环，打印到10结束
		}
		fmt.Println(raound)

	}
}
